/**
 * 随机生成一个长度为 10 的整数类型的数组，
 * 例如 [2, 10, 3, 4, 5, 11, 10, 11, 20]，
 * 将其排列成一个新数组，要求新数组形式如下，
 * 例如 [[2, 3, 4, 5], [10, 11], [20]]
 * 
 * 题目来源：https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/113
 * ps: 这里有两种理解：被10 除后，商向下取整的值一致的为一组，这是我理解的，另一种理解为：
 * 连续的为一组
*/

// let arr = [2, 10, 3, 4, 5, 11, 10, 11, 20];

function getRandomArray(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  let arr = [];
  for(let i = 0; i < 10; i++) {
    arr[i] = Math.floor(Math.random() * (max - min +1) + min)
  }
  return arr
}

let arr = getRandomArray(1, 50)
console.log(arr)

/**
 * 被10 除后为一组的实现
 * */ 
// 使用 hash 方式
function fromArray(arr) {
  if (!Array.isArray(arr) || arr.length == 0) return;
  // 去重 & 排序
  let n = [...new Set(arr)].sort((a, b) => a - b);
  let result = {};
  for (const v of n) {
    let index = Math.floor( v / 10)
    if (!result[index]) result[index] = []
    result[index].push(v);
  }
  return Object.values(result)
}

// 使用map 
function fromArray2(arr) {
  if (!Array.isArray(arr) || arr.length == 0) return;
  // 去重 & 排序
  let n = [...new Set(arr)].sort((a, b) => a -b);
  let map = new Map();
  n.forEach(item => {
    let index = Math.floor( item / 10)
    let group = map.get(index) || [];
    group.push(item);
    map.set(index, group)
  })

  return [...map.values()]
}

console.log(fromArray2(arr))
/**
 * 连续为一组的实现
 * */ 

function consecutiveArray(arr) {
  if (!Array.isArray(arr) || arr.length == 0) return;
  // 去重 & 排序
  let list = [...new Set(arr)].sort((a, b) => a - b);
  let len = list.length;
  let result = [];
  
  for (let i = 0; i < len; i++) {
    let child = [];
    child.push(list[i]);
    while(list[i] + 1 == list[i+1]) {
      child.push(list[i+1])
      i++
    }
    if (child.length > 0) result.push(child)
  }
  return result
}
console.log(consecutiveArray(arr))